【C语言】告诉你为什么unsigned char a= | 您所在的位置:网站首页 › c语言signed char › 【C语言】告诉你为什么unsigned char a= |
一、自动类型转换流程 要注意的是: 在进行自动类型转换时,原数据的类型没有改变,而是得到一个转化后的中间变量 并不是char转化成int又转化成long······ 进入正题 来看一段代码,猜一猜打印的结果是什么 #include int main() { char a = -1; signed char b = -1; unsigned char c = -1; printf("a=%d,b=%d,c=%d", a, b, c); return 0; }结果是:a=-1,b=-1,c=255 可以认为,在当前编译器下,char 等价于signed char 我们知道C语言中为一个字符分配一个字节(8位),一个int整型分配4个字节(32位) 整形数据用整数的补码形式存放 - 1 原码:1000 0000 0000 0000 0000 0000 0000 0001 反码:1111 1111 1111 1111 1111 1111 1111 1110 补码:1111 1111 1111 1111 1111 1111 1111 1111 将-1赋给char型变量 a, 从后边截断8位 a 补码:1111 1111 当用%d打印时,进行自动类型转化,认为a的最高位是符号位,最高位为1,从左补1,直至32位 打印a的中间变量补码为: 1111 1111 1111 1111 1111 1111 1111 1111 1000 0000 0000 0000 0000 0000 0000 0000 原码:1000 0000 0000 0000 0000 0000 0000 0001 所以a打印的是-1,b同理。 c是unsigned char 类型,当用%d打印时,进行自动类型转化,编译器认为c的最高位不是符号位,从左补0,直至32位 因此打印c的中间变量补码为: 0000 0000 0000 0000 0000 0000 1111 1111 转化为十进制为255 所以c打印出来的的是255 |
CopyRight 2018-2019 实验室设备网 版权所有 |